#endif
#ifdef CONFIG_HOTPLUG_CPU
+extern cpumask_t cpu_initialized;
static inline void play_dead(void)
{
idle_task_exit();
+ local_irq_disable();
+ cpu_clear(smp_processor_id(), cpu_initialized);
+ preempt_enable_no_resched();
HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+ /* Same as drivers/xen/core/smpboot.c:cpu_bringup(). */
+ cpu_init();
+ touch_softlockup_watchdog();
+ preempt_disable();
local_irq_enable();
}
#else
}
#ifdef CONFIG_HOTPLUG_CPU
-DECLARE_PER_CPU(int, cpu_state);
-
-#include <asm/nmi.h>
-/* We halt the CPU with physical CPU hotplug */
static inline void play_dead(void)
{
idle_task_exit();
+ local_irq_disable();
+ cpu_clear(smp_processor_id(), cpu_initialized);
+ preempt_enable_no_resched();
HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+ /* Same as drivers/xen/core/smpboot.c:cpu_bringup(). */
+ cpu_init();
+ touch_softlockup_watchdog();
+ preempt_disable();
local_irq_enable();
}
#else
extern void system_call(void);
extern void smp_trap_init(trap_info_t *);
-extern cpumask_t cpu_initialized;
-
/* Number of siblings per CPU package */
int smp_num_siblings = 1;
int phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
static void cpu_bringup(void)
{
- if (!cpu_isset(smp_processor_id(), cpu_initialized)) {
- cpu_init();
- preempt_disable();
- }
+ cpu_init();
+ touch_softlockup_watchdog();
+ preempt_disable();
local_irq_enable();
cpu_idle();
}